package com.mengma.ec.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @Auther: Tangzhiqiang
 * @Date: 2018/9/17 0017 上午 10:25
 * @Description: Redis 操作工具类
 */
@Component
public class RedisComponent {

    // 操作字符串的template，StringRedisTemplate是RedisTemplate的一个子集
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // RedisTemplate可以进行所有的操作
//    @Autowired
//    private RedisTemplate<Object, Object> redisTemplate;


    /**
     * 根据键获取值
     *
     * @param key：键
     * @return
     * @throws Exception
     */
    public String get(String key) throws Exception {
        return this.stringRedisTemplate.opsForValue().get(key);
    }


    /**
     * 设置键值
     *
     * @param key：键
     * @param value：值
     * @return
     * @throws Exception
     */
    public boolean put(String key, String value) throws Exception {
        try {
            ValueOperations<String, String> ops = this.stringRedisTemplate.opsForValue();
            boolean bExistent = this.stringRedisTemplate.hasKey(key);
            if (bExistent) {
                throw new Exception("键已存在!");
            } else {
                ops.set(key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /**
     * 设置键值
     *
     * @param key：键
     * @param value：值
     * @param expires：值在缓存中的持续的时长,毫秒（如发出短信验证时要求用户必须在指定时间完成验证等场景）
     * @return
     * @throws Exception
     */
    public boolean put(String key, String value, long expires) throws Exception {
        return put(key, value, expires, TimeUnit.MILLISECONDS);
    }

    /**
     * 设置键值
     *
     * @param key：键
     * @param value：值
     * @param expires：值在缓存中的持续的时长（如发出短信验证时要求用户必须在指定时间完成验证等场景）
     * @param timeUnit                                        自动过期时间计算单位，从 TimeUnit 类获取（示例：TimeUnit.DAYS）
     * @return
     * @throws Exception
     */
    public boolean put(String key, String value, long expires, TimeUnit timeUnit) throws Exception {
        try {
            ValueOperations<String, String> ops = this.stringRedisTemplate.opsForValue();
            // 判断当前键是否存在
//            boolean bExistent = this.stringRedisTemplate.hasKey(key);
            ops.set(key, value);
            ops.set(key, value, expires, timeUnit);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /**
     * 根据键移除
     *
     * @param key：键
     * @return
     * @throws Exception
     */
    public boolean remove(String key) throws Exception {
        this.stringRedisTemplate.delete(key);
        return true;
    }


}

